4

VCLTMemoコントロールがあり、テキストがスクロールされるたびに通知を受ける必要があります。イベントはなくOnScroll、スクロール メッセージは親フォームまで伝播していないようです。

通知を受け取る方法について何か考えはありますか? 最後の手段として、外部を配置してイベントTScrollBarを更新できますが、カーソルを移動したりマウスホイールをスクロールしたりするときにそれらを同期させる必要があります...TMemoOnScrollTMemo

4

2 に答える 2

3

インターポーザ クラスを使用して、WM_VSCROLLおよびWM_HSCROLLメッセージと EN_VSCROLLおよびEN_HSCROLL通知コード (WM_COMMAND メッセージを通じて公開) を処理できます。

このサンプルを試す

type
  TMemo  = class(Vcl.StdCtrls.TMemo)
  private
   procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
   procedure WMVScroll(var Msg: TWMHScroll); message WM_VSCROLL;
   procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;
  end;

  TForm16 = class(TForm)
    Memo1: TMemo;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form16: TForm16;

implementation

{$R *.dfm}


{ TMemo }

procedure TMemo.CNCommand(var Message: TWMCommand);
begin
   case Message.NotifyCode of
    EN_VSCROLL : OutputDebugString('EN_VSCROLL');
    EN_HSCROLL : OutputDebugString('EN_HSCROLL');
   end;

   inherited ;
end;

procedure TMemo.WMHScroll(var Msg: TWMHScroll);
begin
   OutputDebugString('WM_HSCROLL') ;
   inherited;
end;

procedure TMemo.WMVScroll(var Msg: TWMHScroll);
begin
   OutputDebugString('WM_HSCROLL') ;
   inherited;
end;
于 2013-12-09T05:33:54.037 に答える
2

実行時にメモのWindowProcプロパティをサブクラス化して、メモに送信されたすべてのメッセージをキャッチできます。次に例を示します。

private:
    TWndMethod PrevMemoWndProc;
    void __fastcall MemoWndProc(TMessage &Message);

__fastcall TMyForm::TMyForm(TComponent *Owner)
    : TForm(Owner)
{
    PrevMemoWndProc = Memo1->WindowProc;
    Memo1->WindowProc = MemoWndProc;
}

void __fastcall TMyForm::MemoWndProc(TMessage &Message)
{
    switch (Message.Msg)
    {
        case CN_COMMAND:
        {
            switch (reinterpret_cast<TWMCommand&>(Message).NotifyCode)
            {
                case EN_VSCROLL:
                {
                    //...
                    break;
                }

                case EN_HSCROLL:
                {
                    //...
                    break;
                }
            }

            break;
        }

        case WM_HSCROLL:
        {
            //...
            break;
        }

        case WM_VSCROLL:
        {
            //...
            break;
        }
    }

    PrevMemoWndProc(Message);
}
于 2013-12-09T08:19:40.910 に答える