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

TMemo 的 scroll偵測

答題得分者是:hagar
P.D.
版主


發表:571
回覆:3880
積分:3666
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-07-07 10:53:54 IP:118.169.xxx.xxx 未訂閱
請問各位:

我使用 TMemo 欲製作一個版權宣告的東東, 然後要 user 一定要捲動到最底(使用滑鼠拖動 TMemo 本身的 VScroll 方式)
當拖到底層後, 會顯示一組 TCheckBox, 現在的問題是, 如何在 ScrollBar 被拖到底後可以知道 TMemo 已到底層並動作?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-07-07 11:14:10 IP:210.242.xxx.xxx 未訂閱
是要判斷 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.
版主


發表:571
回覆:3880
積分:3666
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-07-07 23:57:20 IP:118.169.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-07-08 16:46:07 IP:210.242.xxx.xxx 未訂閱
Sorry! 小弟不知道為何您那邊不成功?小弟這邊試是 OK 的.
另外可參考這篇, 他的方式也差不多.

http://delphi.xcjc.net/viewthread.php?tid=35249
RootKit
資深會員


發表:16
回覆:357
積分:419
註冊:2008-01-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-07-13 16:09:10 IP:60.250.xxx.xxx 訂閱
直接使用 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.
版主


發表:571
回覆:3880
積分:3666
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-07-13 22:39:09 IP:118.169.xxx.xxx 未訂閱
我改回 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, 註解 無‧
系統時間:2017-10-18 13:29:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!