gpt4 book ai didi

delphi - 设置 CustomComponent(TEDIT) MaxLength 属性不起作用

转载 作者:行者123 更新时间:2023-12-02 09:15:33 26 4
gpt4 key购买 nike

我创建了一个源自 TEdit 的新组件。在下面的代码中,我在将 AllowValues 设置为 true 后将 MaxLength 属性设置为 10。

我在表单上设置组件并将AllowValues 设置为 true 并运行应用程序,编辑框允许超过 10 个字符。我的代码有什么问题吗?

unit DummyEdit;

interface

uses
SysUtils, Classes, Controls, StdCtrls,Dialogs,Windows,Messages;

type
TDUMMYEdit = class(TEdit)
private
{ Private declarations }
FAllowValues : Boolean;
FMaxLength: Integer;
Procedure SetAllowValues(Value : Boolean);
procedure SetMaxLength(Value: Integer);
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
Property AllowValues : Boolean read FAllowValues write SetAllowValues;
property MaxLength: Integer read FMaxLength write SetMaxLength default 0;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('DUMMY', [TDUMMYEdit]);
end;

{ TDUMMYEdit }


procedure TDUMMYEdit.SetAllowValues(Value: Boolean);
begin
if FAllowValues <> value then
FAllowValues := Value;
if FAllowValues then
MaxLength := 10
else
MaxLength := 0;
end;

procedure TDUMMYEdit.SetMaxLength(Value: Integer);
begin
if FMaxLength <> Value then
begin
FMaxLength := Value;
if HandleAllocated then SendMessage(Handle, EM_LIMITTEXT, Value, 0);
end;
end;

end.

最佳答案

在寻找答案时,我意识到您为自定义编辑重新发明了 MaxLength 属性。这是你的意图吗?除非我弄错了,目前的所有不同之处在于您不小心引入了本问题主题的错误。如果您没有引入该属性,您的代码应该可以工作。

因此,解决问题的一种方法是从 TDUMMYEdit 中删除 MaxLength 属性,而依赖 TCustomEdit 实现的属性。

您的问题是,当您的代码在 DFM 的组件流式传输期间生效时,没有分配 HandleHandleAllocation 返回 False 并且您的 EM_LIMITTEXT 消息将不会被发送。稍后设置 AllowValues 属性,例如在您表单的事件处理程序中,将按您的预期工作,因为此时分配了一个句柄。

可以通过查看 Vcl.StdCtrls 中的TCustomEdit 找到解决此问题的方法 - 您可能已将代码作为示例,它看起来非常相似 - 过程 DoSetMaxLength - 将发送与您尝试发送的消息相同的消息 - 也会在存在有效 Handle 时在 TCustomEdit.CreateWnd 中调用> 创建。您的代码的修复将如下所示:

  TDUMMYEdit = class(TEdit)
private
{ Private declarations }
FAllowValues : Boolean;
FMaxLength: Integer;
Procedure SetAllowValues(Value : Boolean);
procedure SetMaxLength(Value: Integer);
protected
{ Protected declarations }
procedure CreateWnd; override;
public
{ Public declarations }
published
{ Published declarations }
Property AllowValues : Boolean read FAllowValues write SetAllowValues;
property MaxLength: Integer read FMaxLength write SetMaxLength default 0;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('DUMMY', [TDUMMYEdit]);
end;

{ TDUMMYEdit }

...
procedure TDUMMYEdit.CreateWnd;
begin
inherited CreateWnd;
SendMessage(Handle, EM_LIMITTEXT, FMaxLength, 0);
end;
...

关于delphi - 设置 CustomComponent(TEDIT) MaxLength 属性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47653358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com