首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加到TScrollBox的助手方法不起作用

添加到TScrollBox的助手方法不起作用
EN

Stack Overflow用户
提问于 2017-12-01 11:56:11
回答 1查看 199关注 0票数 0

在我被指示开发的一个老项目中,有一个类型为TScrollBox的字段。

代码语言:javascript
复制
FScroll   : TScrollBox;

为了能够处理导航按钮的事件,类必须包含一个WM_GETDLGCODE消息处理程序。所以我创建了一个新的类:

代码语言:javascript
复制
TScrollBoxArrowBtn = class(TScrollBox)
protected
  procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
end;

实现

代码语言:javascript
复制
procedure TScrollBoxArrowBtn.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
  Message.Result := DLGC_WANTARROWS;
end;

并将TScrollBox类型替换为TScrollBoxArrowBtn。

代码语言:javascript
复制
FScroll   : TScrollBoxArrowBtn;

组件开始响应按箭头按钮。但是,复制、删除、SelectAll方法停止工作。之所以发生这种情况,是因为前面的开发人员向验证方法添加了如下内容:

代码语言:javascript
复制
"VariableName".ClassType = TScrollBox

我代之以进行核查:

代码语言:javascript
复制
"VariableName" is TScrollBox

在这种编辑方法开始起作用之后。但我不确定这样的测试不会在项目的其他地方应用。所以我决定离开

代码语言:javascript
复制
FScroll   : TScrollBox;

并使TScrollBoxArrowBtn成为一个助手类:

代码语言:javascript
复制
TScrollBoxArrowBtn = class helper for TScrollBox
protected
  procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
end;

不幸的是,这种方法不起作用。像"VariableName".ClassType = TScrollBox这样的验证开始完美地工作,但是项目停止响应事件箭头按钮。我做错什么了?

我确信我的IDE版本支持帮助方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-28 07:55:03

我没有找到关于helpers类中的消息方法的具体答案,但我找到了解决问题的方法。此外,我还了解了helper类的许多其他坏特性,这些特性最终说服了我放弃使用它们。所以我的答案是-不要使用班底帮手。此时,这是一个非常不稳定的工具。也许将来会有所改善。

对我的决定不屑一顾。正如我所担心的,检查以下类型的问题:

代码语言:javascript
复制
"VariableName".ClassType = TScrollBox

合并以前创建的分支时再次出现。因此,我决定替换TScrollBox窗口过程。我在TScrollBox字段容器类中添加了字段,并在容器类中为TScrollBox字段添加了一个新的窗口过程:

代码语言:javascript
复制
TCADParamsGroupBlockBaseScheme = class (TCADGroupBlockParams)
.....................................................
protected

  Old_FScroll_WindowProc   : TWndMethod;
  procedure New_FScroll_WindowProc(var Message: TMessage);
.....................................................
end;

implementation

procedure TCADParamsGroupBlockBaseScheme.New_FScroll_WindowProc(var Message: 
TMessage);
begin
  //Для обработки событий нажатий Key_Up/Down/Left/Right в DoKeyDown
  if Message.Msg = WM_GETDLGCODE then
    Message.Result := DLGC_WANTARROWS
  else Old_FScroll_WindowProc(Message);
end;

在容器类的构造函数中,我保存了指向旧TScrollBox字段窗口过程的指针,并为它分配了一个新的窗口过程:

代码语言:javascript
复制
constructor TCADParamsGroupBlockBaseScheme.Create(const AOwner: TWinControl);
begin
...........................................
FScroll := TScrollBox.Create(FHost.Owner);

Old_FScroll_WindowProc := FScroll.WindowProc;
FScroll.WindowProc := New_FScroll_WindowProc;
............................................
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47592875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档