1

您如何获得在运行时输入到 JvInspector 中的值?

中的 Demo\..\jvcl\examples\JvInspector展示了如何添加字符串,通过编写类似这样的内容(从演示中提取):

var
  FirstName: string;

implementation

procedure TfrmInspector.AddVarious;
var
  InspCat: TJvInspectorCustomCategoryItem;
begin
  TJvInspectorVarData.New(InspCat, 'First', TypeInfo(string), @FirstName).DisplayName := 'Copy of first name';
end;

我想添加一个 TColor 属性,所以我这样做了:

var
  FirstName: string;
  SomeColor: TColor;

implementation

procedure TfrmInspector.AddVarious;
var
  InspCat: TJvInspectorCustomCategoryItem;
begin
  TJvInspectorVarData.New(InspCat, 'First', TypeInfo(string), @FirstName).DisplayName := 'Copy of first name';
  TJvInspectorVarData.New(InspCat, 'SomeColor', TypeInfo(TColor), @SomeColor;
end;

这显示正确,但从检查器的下拉列表中选择新颜色时,我似乎无法获得为 SomeColor 更改的值。

我试过这个:

procedure TfrmInspector.JvInspector1ItemValueChanged(Sender: TObject;
  Item: TJvCustomInspectorItem);
begin
  if (Item.Data <> nil) and (CompareText(Item.Data.Name, 'FirstName') = 0) then
    ShowMessage(Item.Data.AsString) //< works
  else if (Item.Data <> nil) and (CompareText(Item.Data.Name, 'SomeColor') = 0) then
    ShowMessage(ColorToString(TColor(Item.Data))); //< does not return correct value
end;

我通常不使用 Jedi 组件,但我想我会给他们另一个机会,但似乎文档很少,我在 Wiki 页面上查看了 OnItemValueChanged 事件:http://wiki.delphi-jedi.org/wiki/JVCL_Help: TJvInspector.OnItemValueChanged但几乎没有任何信息或帮助。

我确定不是试图让ColorToString(TColor(Item.Data))我需要使用Item.Data.AsVariant但我可能是错的,当我尝试时我得到了 AV 错误所以我可能完全错了,我做过或尝试过的任何事情似乎都不起作用:(

4

2 回答 2

2

Item.Data属性是类型的对象引用TJvCustomInspectorData;将其类型转换为TColor废话。TColor是一个序数类型,所以使用该AsOrdinal方法,就像字符串代码使用的那样AsString

ShowMessage(ColorToString(TColor(Item.Data.AsOrdinal)));

或者,您应该能够从SomeColor最初创建项目时传递的全局变量中读取。

于 2013-01-03T21:48:47.427 回答
0

我找到了一种可行的方法:

procedure TfrmInspector.JvInspector1ItemValueChanged(Sender: TObject;
  Item: TJvCustomInspectorItem);
var
  sVal: string;
begin
  if (Item.Data <> nil) then
  begin
    sVal := Item.DisplayValue;

    if (CompareText(Item.Data.Name, 'FirstName') = 0) then
      ShowMessage('FirstName Value: ' + sVal)
    else if (CompareText(Item.Data.Name, 'SomeColor') = 0) then
      ShowMessage('SomeColor Value: ' + sVal); //<can use StringToColor now
  end;
end;

虽然可能不是我认为我会发布它的最佳方式。

于 2013-01-03T20:11:30.603 回答