我正在尝试编写自己的简单属性检查器,但是我面临着一个困难且相当混乱的问题。首先,尽管让我说我的组件不是要使用或处理组件属性,而是允许向其添加自定义值。我组件的完整源代码在问题的后面,一旦将其安装在软件包中并从一个新的空项目中运行,它应该看起来像这样:
问题在于使用就地编辑器并验证属性值。想法是,如果属性值无效,则向用户显示一条消息,通知他们该值不能被接受,然后将焦点放回到最初集中在的行和就位编辑器上。
实际上,我们可以使用Delphi自己的Object Inspector来说明我要寻找的行为,例如,尝试在Name无法接受的属性中编写字符串,然后单击Object Inspector。显示一条消息,关闭该消息后,它将聚焦回到该Name行。
没有任何代码,问题变得太模糊了,但是由于我要编写的组件的性质,这个问题也很大。为了问题和示例的目的,我已尽可能将其简化。我敢肯定会有一些评论问我为什么不这样做或不这样做,但是重要的是要知道我不是Delphi专家,并且经常做出错误的决定和选择,但是我总是愿意学习,所以所有评论表示欢迎,特别是如果它有助于寻找我的解决方案。
unit MyInspector;
interface
uses
Winapi.Windows,
Winapi.Messages,
System.Classes,
System.SysUtils,
Vcl.Controls,
Vcl.Dialogs,
Vcl.StdCtrls,
Vcl.Graphics,
Vcl.Forms;
type
TMyInspectorItems = class(TObject)
private
FPropertyNames: TStringList;
FPropertyValues: TStringList;
procedure AddItem(APropName, APropValue: string);
procedure Clear;
public
constructor Create;
destructor Destroy; override;
end;
TOnMouseMoveEvent = procedure(Sender: TObject; X, Y: Integer) of object;
TOnSelectRowEvent = procedure(Sender: TObject; PropName, PropValue: string; RowIndex: Integer) of object;
TMyCustomInspector = class(TGraphicControl)
private
FInspectorItems: TMyInspectorItems;
FOnMouseMove: TOnMouseMoveEvent;
FOnSelectRow: TOnSelectRowEvent;
FRowCount: Integer; …Run Code Online (Sandbox Code Playgroud)