添加到 TScrollBox 的辅助方法不起作用
The helper method added to TScrollBox does not work
在我受命开发的一个旧项目中,有一个 TScrollBox 类型的字段。
FScroll : TScrollBox;
为了能够处理导航按钮的事件,class 必须包含一个 WM_GETDLGCODE 消息处理程序。所以我创建了一个新的 class:
TScrollBoxArrowBtn = class(TScrollBox)
protected
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
end;
实施
procedure TScrollBoxArrowBtn.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
Message.Result := DLGC_WANTARROWS;
end;
并将 TScrollBox 类型替换为 TScrollBoxArrowBtn。
FScroll : TScrollBoxArrowBtn;
组件开始响应按下箭头按钮。但是复制、删除、SelectAll 方法停止工作。发生这种情况是因为之前的开发人员添加了这样的验证方法:
"VariableName".ClassType = TScrollBox
我替换了它们以供验证:
"VariableName" is TScrollBox
在这种编辑方法开始起作用之后。但我不确定这样的测试是否会应用于项目的其他地方。所以我决定离开
FScroll : TScrollBox;
并使 TScrollBoxArrowBtn 成为助手 class:
TScrollBoxArrowBtn = class helper for TScrollBox
protected
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
end;
不幸的是,这个方法不起作用。 "VariableName".ClassType = TScrollBox
之类的验证开始完美运行,但项目停止响应事件箭头按钮。我做错了什么?
我确信我的 IDE 版本支持辅助方法。
我没有在助手 classes 中找到具体关于消息方法的答案,但我找到了解决问题的方法。此外,我了解到 helper class 的许多其他不良功能,最终说服我放弃使用它们。所以我的答案是 - 不要使用 class 助手。目前这是一个非常不稳定的工具。或许以后会有所改进
现在谈谈我的决定。正如我所担心的,检查类型的问题如下:
"VariableName".ClassType = TScrollBox
在合并之前创建的分支时再次出现。所以我决定替换 TScrollBox window 程序。我在 TScrollBox-field 容器 class 中添加了字段,并在容器 class:
中为 TScrollBox-field 添加了一个新的 window 过程
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;
并且在容器 class 的构造函数中,我保存了指向旧 TScrollBox-field window 过程的指针并为其分配了一个新的 window 过程:
constructor TCADParamsGroupBlockBaseScheme.Create(const AOwner: TWinControl);
begin
...........................................
FScroll := TScrollBox.Create(FHost.Owner);
Old_FScroll_WindowProc := FScroll.WindowProc;
FScroll.WindowProc := New_FScroll_WindowProc;
............................................
end;
在我受命开发的一个旧项目中,有一个 TScrollBox 类型的字段。
FScroll : TScrollBox;
为了能够处理导航按钮的事件,class 必须包含一个 WM_GETDLGCODE 消息处理程序。所以我创建了一个新的 class:
TScrollBoxArrowBtn = class(TScrollBox)
protected
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
end;
实施
procedure TScrollBoxArrowBtn.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
Message.Result := DLGC_WANTARROWS;
end;
并将 TScrollBox 类型替换为 TScrollBoxArrowBtn。
FScroll : TScrollBoxArrowBtn;
组件开始响应按下箭头按钮。但是复制、删除、SelectAll 方法停止工作。发生这种情况是因为之前的开发人员添加了这样的验证方法:
"VariableName".ClassType = TScrollBox
我替换了它们以供验证:
"VariableName" is TScrollBox
在这种编辑方法开始起作用之后。但我不确定这样的测试是否会应用于项目的其他地方。所以我决定离开
FScroll : TScrollBox;
并使 TScrollBoxArrowBtn 成为助手 class:
TScrollBoxArrowBtn = class helper for TScrollBox
protected
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
end;
不幸的是,这个方法不起作用。 "VariableName".ClassType = TScrollBox
之类的验证开始完美运行,但项目停止响应事件箭头按钮。我做错了什么?
我确信我的 IDE 版本支持辅助方法。
我没有在助手 classes 中找到具体关于消息方法的答案,但我找到了解决问题的方法。此外,我了解到 helper class 的许多其他不良功能,最终说服我放弃使用它们。所以我的答案是 - 不要使用 class 助手。目前这是一个非常不稳定的工具。或许以后会有所改进
现在谈谈我的决定。正如我所担心的,检查类型的问题如下:
"VariableName".ClassType = TScrollBox
在合并之前创建的分支时再次出现。所以我决定替换 TScrollBox window 程序。我在 TScrollBox-field 容器 class 中添加了字段,并在容器 class:
中为 TScrollBox-field 添加了一个新的 window 过程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;
并且在容器 class 的构造函数中,我保存了指向旧 TScrollBox-field window 过程的指针并为其分配了一个新的 window 过程:
constructor TCADParamsGroupBlockBaseScheme.Create(const AOwner: TWinControl);
begin
...........................................
FScroll := TScrollBox.Create(FHost.Owner);
Old_FScroll_WindowProc := FScroll.WindowProc;
FScroll.WindowProc := New_FScroll_WindowProc;
............................................
end;