Delphi:使组件可见绑定 [英] Delphi: Making a component visible to live binding

查看:279
本文介绍了Delphi:使组件可见绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试制作一个可视化绑定表单的字符串属性可见的测试对象。组件注册了相应的属性。使用XE8和Firemonkey。

I have been trying to make a test object that has a string property visible to the visual binding form. The component is registered with the appropriate properties. Using XE8 and Firemonkey.

我可以通过使用隐藏显示元素选择它来显示视觉活页夹,但是我无法将其绑定到Foo字符串一个TEdit文本属性,readonly(什么也没有)将绑定到Text属性。

I can get it to show on the visual binder by selecting it using the hide show elements, however I cannot get it to bind the Foo string to a TEdit text property, the readonly (which does nothing yet) will bind to the Text Property.


  • 我该如何看到它具有默认类可见性

  • 为什么Foo字符串不绑定到文本属性

这个帮助文件有点薄。我想我在这里错过了一些非常简单的东西。

The help files are a little thin on this. I guessing I'm missing something really simple here.

对象代码在下面。

谢谢。单位TestOBj; p>

Thanks.

unit TestOBj;

interface

uses
  System.Classes, System.SysUtils, System.StrUtils, Data.Bind.Components;

Type

  TMyLBObject = Class (TComponent)
  private
    fFooString:String;
    FReadOnly: Boolean;
    procedure SetReadOnly(const Value: Boolean);
    procedure SetFooString(const Value: String);
  protected
    function CanObserve(const ID: Integer): Boolean; override;                       
    procedure ObserverAdded(const ID: Integer; const Observer: IObserver); override;
    procedure ObserverToggle(const AObserver: IObserver; const Value: Boolean);
  published
    property Foo:String read FFooString write SetFooString;
    property ReadOnly:Boolean read FReadOnly write SetReadOnly;
  End;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Test', [TMyLBObject]);
end;

{ TMyLBObject }

function TMyLBObject.CanObserve(const ID: Integer): Boolean;
begin
  Result := False;
  if ID = TObserverMapping.EditLinkID then
    Result := True;
  if ID = TObserverMapping.ControlValueID then
    Result := True;
end;

procedure TMyLBObject.ObserverAdded(const ID: Integer;
  const Observer: IObserver);
begin
  if ID = TObserverMapping.EditLinkID then
    Observer.OnObserverToggle := ObserverToggle;
end;


procedure TMyLBObject.ObserverToggle(const AObserver: IObserver;
  const Value: Boolean);
var
  LEditLinkObserver: IEditLinkObserver;
  LSaveReadOnly: Boolean;
begin
  if Supports(AObserver, IEditLinkObserver, LEditLinkObserver) then
  begin
    if Value then
    begin
      LSaveReadOnly := ReadOnly;
      if LEditLinkObserver.IsReadOnly then
        ReadOnly := True;
      FReadOnly := LSaveReadOnly;
    end
    else
      if not (csDestroying in ComponentState) then
        ReadOnly := FReadOnly;
  end;
end;


procedure TMyLBObject.SetFooString(const Value: String);
begin
  FFooString := Value;
end;

procedure TMyLBObject.SetReadOnly(const Value: Boolean);
begin
  FReadOnly := Value;
end;


initialization
  RegisterClass(TMyLBObject);
  RegisterObservableMember(TArray<TClass>.Create(TMyLBObject), 'Foo', 'FMX');
finalization
  UnRegisterObservableMember(TArray<TClass>.Create(TMyLBObject));
end.


推荐答案

您的 TMyLBObject 组件没有 [ObservableMember('Foo')] 属性。

type
  [ObservableMember('Foo')] // <-- add this
  TMyLBObject = Class (TComponent)
    ...
  published
    property Foo:String read FFooString write SetFooString;
    ...
  End;

请参阅文档中的示例:

教程:创建启用LiveBindings的组件

其中包括此注释:


LiveBindings组件将使用ObservableMember属性来生成表达式。 RegisterObserverableMember()将在设计时使用,通知LiveBindings Designer。

The ObservableMember attribute will be used by LiveBindings components to generate expressions. RegisterObserverableMember() will be used at design time to inform the LiveBindings Designer.

这篇关于Delphi:使组件可见绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆