2
  1. 创建一个简单的 FireMonkey 移动应用程序。
  2. 在表单中添加一个 TEdit 字段。
  3. 分配 OnApplyStyleLookup 事件
  4. 编写以下代码

    procedure TForm1.Edit1ApplyStyleLookup(Sender: TObject);
    var
      Obj: TFmxObject;
    begin
      Obj := Edit1.FindStyleResource('background');
      if Obj <> nil then
        ShowMessage('Obj is not nil')
      else
        ShowMessage('Obj is nil');
    end;
    

XE6 中的代码运行良好,XE7 Obj 内部为零。请问,这是什么原因,怎么去Obj?

如下代码,获取Obj与NIL值相同:

TMyEdit = class(TEdit)
protected
  procedure ApplyStyle;override;
...

procedure TMyEdit.ApplyStyle;
var
  Obj: TFmxObject;
begin
  inherited;
  Obj := Self.FindStyleResource('background');
  ...
end;  
4

1 回答 1

1

我对 C++Builder XE7 有同样的问题。这就是我解决它的方法。我创建了该功能:

static Fmx::Types::TFmxObject* __fastcall FindStyle(
    Fmx::Types::TFmxObject* AFmxObject, const System::UnicodeString AStyleLookup)
{
    if(AFmxObject == NULL)
    {
        return NULL;
    }

    Fmx::Types::TFmxObject* Result = NULL;
    const int LChildrenCount = AFmxObject->ChildrenCount;
    for(int i = 0; i < LChildrenCount; ++i)
    {
        if(AFmxObject->Children->Items[i]->StyleName == AStyleLookup)
        {
            Result = AFmxObject->Children->Items[i];
            break;
        }
        Result = FindStyle(AFmxObject->Children->Items[i], AStyleLookup);
        if(Result != NULL)
        {
            break;
        }
    }
    return Result;
}

只需像这样调用函数:

#if __CODEGEARC__ < 0x0690
    Fmx::Types::TFmxObject* LStyleResource = LEdit->FindStyleResource("background");
#else
    Fmx::Types::TFmxObject* LStyleResource = FindStyle(LEdit, "background");
#endif

它并不复杂,所以我想为 Delphi 编写代码会很容易。

于 2014-10-06T00:11:49.830 回答