Delphi 在StdCntrls单元中的TEdit类中重写默认的按键方法

Delphi 在StdCntrls单元中的TEdit类中重写默认的按键方法,delphi,Delphi,避免输入单引号。但在编译项目时出错: [致命错误]StdCtrls.pas(1238):使用不同版本的StdCtrls.TEdit编译单元对话框 VCL的源代码可以读取和调试,但许可证不允许您进行更改和分发这些更改(至少据我所知) 在您的情况下,如果希望在多个表单或项目中重用此控件,最好创建一个从TEdit(或TCustomEdit)派生的新控件。VCL的源代码可以读取和调试,但许可证不允许您进行更改和分发这些更改(至少据我所知) 在您的情况下,如果要在多个表单或项目中重用此控件,最好创建一个从

避免输入单引号。但在编译项目时出错:

[致命错误]StdCtrls.pas(1238):使用不同版本的StdCtrls.TEdit编译单元对话框


VCL的源代码可以读取和调试,但许可证不允许您进行更改和分发这些更改(至少据我所知)


在您的情况下,如果希望在多个表单或项目中重用此控件,最好创建一个从TEdit(或TCustomEdit)派生的新控件。

VCL的源代码可以读取和调试,但许可证不允许您进行更改和分发这些更改(至少据我所知)


在您的情况下,如果要在多个表单或项目中重用此控件,最好创建一个从TEdit(或TCustomEdit)派生的新控件。

只需编写一个
OnKeyPress
事件处理程序:

procedure TMyForm.EditNoSingleQuotes(Sender: TObject; var Key: Char);
begin
  if Key = '''' then Key := #0;
end;
或者从
TEdit
继承并覆盖
KeyPress
方法:

procedure TMyEdit.KeyPress(var Key: Char);
begin
  if Key = '''' then Key := #0;
  inherited KeyPress(Key);
end;

只需编写一个
OnKeyPress
事件处理程序:

procedure TMyForm.EditNoSingleQuotes(Sender: TObject; var Key: Char);
begin
  if Key = '''' then Key := #0;
end;
或者从
TEdit
继承并覆盖
KeyPress
方法:

procedure TMyEdit.KeyPress(var Key: Char);
begin
  if Key = '''' then Key := #0;
  inherited KeyPress(Key);
end;

您更改了StdCtrls单元的接口。这就要求所有使用它的单元也要重新编译,即使是Delphi提供的VCL单元。如果有一种方法可以在不修改德尔福单位的情况下实现目标,那就选择它

无需提供自己版本的StdCtrls.pas。您需要做的一切都可以通过继承基本
TEdit
控件来完成。几年前,下面的彼得演示了如何。您可以修改代码以接受除撇号以外的所有内容

简而言之,您可以这样做:

  • 覆盖以拒绝不需要的键。证明了这一点
  • 提供消息处理程序以从剪贴板中筛选不需要的字符
  • 提供和消息处理程序,以过滤直接使用和属性时产生的不需要的字符

您更改了StdCtrls装置的接口。这就要求所有使用它的单元也要重新编译,即使是Delphi提供的VCL单元。如果有一种方法可以在不修改德尔福单位的情况下实现目标,那就选择它

无需提供自己版本的StdCtrls.pas。您需要做的一切都可以通过继承基本
TEdit
控件来完成。几年前,下面的彼得演示了如何。您可以修改代码以接受除撇号以外的所有内容

简而言之,您可以这样做:

  • 覆盖以拒绝不需要的键。证明了这一点
  • 提供消息处理程序以从剪贴板中筛选不需要的字符
  • 提供和消息处理程序,以过滤直接使用和属性时产生的不需要的字符

嗨。。。谢谢你的回复。我能够在TDBEdit类中,在DBCntrls单元中修改KeyPress方法(已经被重写),并且编译时没有任何错误。但是对于TEdit,我做了如下更改TEdit=class(TCustomEdit)//Melvina protectedprocedure KeyPress(var Key:Char);覆盖//梅尔维娜:你觉得这种方法有什么问题吗?我们在整个项目中多次使用TEdit。导出新的控件并进行替换将涉及到大量的开发和测试工作。如果有任何建议,请告诉我。提前谢谢。。。。MelvinaWhat是Delphi提供的任何软件包的新版本,您不允许发布它。您可以重新编译Delphi提供的单元,只要它们包含在您的EXE或您自己的包中。@melvina->“派生新控件并替换将需要很大的努力”-如果可以在需要重写行为的地方向uses子句添加单元引用,请查看interposer类()@Rob Kennedy:我知道有一些限制,但我不太清楚具体是什么。谢谢你说清楚。嗨。。。谢谢你的回复。我能够在TDBEdit类中,在DBCntrls单元中修改KeyPress方法(已经被重写),并且编译时没有任何错误。但是对于TEdit,我做了如下更改TEdit=class(TCustomEdit)//Melvina protectedprocedure KeyPress(var Key:Char);覆盖//梅尔维娜:你觉得这种方法有什么问题吗?我们在整个项目中多次使用TEdit。导出新的控件并进行替换将涉及到大量的开发和测试工作。如果有任何建议,请告诉我。提前谢谢。。。。MelvinaWhat是Delphi提供的任何软件包的新版本,您不允许发布它。您可以重新编译Delphi提供的单元,只要它们包含在您的EXE或您自己的包中。@melvina->“派生新控件并替换将需要很大的努力”-如果可以在需要重写行为的地方向uses子句添加单元引用,请查看interposer类()@Rob Kennedy:我知道有一些限制,但我不太清楚具体是什么。感谢您澄清。一个或两个表单的好解决方案,100个表单的坏解决方案。一个或两个表单的好解决方案,100个表单的坏解决方案。甚至包括经常被忽略的粘贴处理。我想知道为什么melvina想要排除引号-我怀疑可能有人试图在生成的sql中阻止引号,在这种情况下,参数化查询(或至少QuotedStr)可能是更好的解决方案。melvina:我派生了一个自定义TEdit控件并重写了Keypress方法。现在编写一个实用程序,将所有pas和dfm文件中的TEdit更改为新控件。非常感谢你,罗伯。。。感谢Gerry、Sertac Akyuz、splash和Chris Thornton的回复……甚至包括经常被忽略的粘贴处理。我想知道为什么melvina想要排除引号——我怀疑可能有人试图阻止在生成的sql中使用引号,其中cas