TMemo 的 scroll偵測 |
答題得分者是:hagar
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
是要判斷 TMemo 的 VScrollbar 捲到底了嗎?
試試攔截 TMemo 的 WMVSCROLL 訊息: procedure TMemo.WMVSCROLL(var Message: TWMVSCROLL); var info: TScrollInfo; begin inherited; FillChar(info, SizeOf(info), 0); with info do begin cbsize := SizeOf(info); fmask := SIF_ALL; GetScrollInfo(Self.Handle, SB_VERT, info); fmask := fmask or SIF_PAGE; end; if Integer(info.nPage) info.nPos > info.nMax then // Scrollbar 底了 begin // ... end; end; |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
hager 兄您好:
我按您的方式操作, 程式編譯沒有問題, 但scroll捲動底沒有反應, 應是 Integer(info.nPage) info.nPos > info.nMax 這段的問題 我對 info 如何取得數值不是很清楚, 只知道透過 fillchar()來操作, 而其中 npage, mpos 與 nmax 好像取出的值對不上 我的code 如下 [code delphi] unit P_Regist; interface uses dialogs, Windows, SysUtils, Classes, Forms, Graphics, ExtCtrls, StdCtrls, Messages, Mask, Buttons, Controls, Registry, U_crypt, DBGrids, AdvMemo, AdvOfficePager, AdvOfficePagerStylers, AdvGlowButton, AdvOfficeButtons, VrControls, VrTrackBar, RzPanel, OleCtrls, Shader, CGKeyProATLLib_TLB; type TAdvMemo = class(AdvMemo.TAdvMemo) Protected procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL; end; .... 略 implementation procedure TAdvMemo.WMVSCROLL(var Message: TWMVSCROLL); var info: TScrollInfo; begin inherited; FillChar(info, SizeOf(info), 0); with info do begin cbsize := SizeOf(info); fmask := SIF_ALL; GetScrollInfo(Self.Handle, SB_VERT, info); fmask := fmask or SIF_PAGE; end; if Integer(info.nPage) info.nPos > info.nMax then begin Form_Regist.cbx_Agress.Enabled:= True; end; end; [/code] ===================引 用 hagar 文 章=================== 是要判斷 TMemo 的 VScrollbar 捲到底了嗎? 試試攔截 TMemo 的 WMVSCROLL 訊息: procedure TMemo.WMVSCROLL(var Message: TWMVSCROLL); var ? info: TScrollInfo; begin ? inherited; ? FillChar(info, SizeOf(info), 0); ? with info do ? begin ??? cbsize := SizeOf(info); ??? fmask? := SIF_ALL; ??? GetScrollInfo(Self.Handle, SB_VERT, info); ??? fmask := fmask or SIF_PAGE; ? end; ? if Integer(info.nPage) info.nPos > info.nMax then // Scrollbar?底了 ? begin // ... ? end; end; ? |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
直接使用 Timer ,因為必須克服 按鍵、滾輪、ScrollBar 前兩項不會觸發 WM_VSCROLL
procedure TForm1.Timer1Timer(Sender: TObject); var Info:TScrollInfo; begin Info.cbSize := SizeOf(TScrollInfo); Info.fMask := SIF_POS or SIF_RANGE or SIF_PAGE; GetScrollInfo(Memo1.Handle,SB_VERT,Info); If (Info.nMax = Info.nPos Info.nPage-1 ) Then Begin Timer1.Enabled := False; CheckBox1.Checked := True; End; end; |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
我改回 TMemo 元件就可以了, 但使用 TMS 元件中的 TAdvMemo 沒有效用, 可能 AdvMemo 傳導參數有不一樣的方式吧, 謝謝兩位大大的提供資料
另外我參考了hager兄提供的國外文獻, 裡面更提到了滾輪的方式, 加入測試也ok 以下是我修改的結果 [code delphi] // 偵測 TMemo 的 VScroll 動作 type TMemo = class(Stdctrls.tmemo) protected procedure WMVScroll(var Msg: TWMVScroll); message WM_VSCROLL; procedure WM_MOUSEWHEEL(var Msg: TWMMouseWheel); message WM_MOUSEWHEEL; procedure OnMyScroll; end; .... implementation procedure TMemo.WMVScroll(var Msg: TWMVScroll); begin inherited; OnMyScroll; end; procedure TMemo.WM_MOUSEWHEEL(var Msg: TWMMouseWheel); begin inherited; OnMyScroll; end; procedure TMemo.OnMyScroll; var info: TScrollInfo; begin info.cbsize := SizeOf(info); info.fmask := SIF_ALL; GetScrollInfo(Self.Handle, SB_VERT, info); Form_Regist.cbx_Agress.Enabled:= (Info.nMax - Info.nPos) <= Info.nPage; end; [/code]
編輯記錄
P.D. 重新編輯於 2010-07-13 22:42:13, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |