2
  1. 簡単な FireMonkey Mobile アプリを作成します。
  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 に答える