相关疑难解决方法(0)

编写自定义属性检查器-验证值时如何处理就地编辑器焦点?

总览

我正在尝试编写自己的简单属性检查器,但是我面临着一个困难且相当混乱的问题。首先,尽管让我说我的组件不是要使用或处理组件属性,而是允许向其添加自定义值。我组件的完整源代码在问题的后面,一旦将其安装在软件包中并从一个新的空项目中运行,它应该看起来像这样:

在此处输入图片说明

问题(简要)

问题在于使用就地编辑器并验证属性值。想法是,如果属性值无效,则向用户显示一条消息,通知他们该值不能被接受,然后将焦点放回到最初集中在的行和就位编辑器上。

实际上,我们可以使用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)

delphi delphi-xe7

5
推荐指数
1
解决办法
340
查看次数

标签 统计

delphi ×1

delphi-xe7 ×1