更改对象时通知TObjectList [英] Notify the TObjectList when Object changed

查看:61
本文介绍了更改对象时通知TObjectList的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

(TObjectList)的对象可以知道(TMyObject)的某些值何时更改吗?

Can the object of (TObjectList) know when some values of (TMyObject) was changed?

例如:

TMyObject = class
  oName: string;
end;

TMyObjectList = class(TObjectList<TMyObject>)
end;

procedure Form1.Button1.Click(Sender: TObject);
var
  Obj: TMyObject;
  List: TMyObjectList;
Begin
 List:= TMyObjectList.Create;
 Obj:= TMyObject.Create;
 List.Add(Obj);
 List[0].oName:= 'Test'; // here a want to know from var (List) when this object (Obj or List[0]) changed his value..
end;

感谢您的帮助。

推荐答案

我刚刚将 TObservableList< T> 类型添加到Spring4D(功能/可观察列表分支)。它主要是根据.NET建模的,并使用INotifyPropertyChanged接口将其事件处理程序附加到支持它的任何对象。此类已经成为DSharp的一部分,并已用于生产中。将来可能会有所改变,并成为该库的完整部分。

I just added the TObservableList<T> type to Spring4D (feature/observablelist branch). It is mostly modeled after .NET and uses the INotifyPropertyChanged interface to attach its event handler to any objects that support it. This class has been part of DSharp for quite some time and is used in production. It might change a bit in the future and become full part of the library.

这里是一个如何使用它的小示例,您可以了解一下:

Here is a small example how to use it so you get an idea:

program Project60;

{$APPTYPE CONSOLE}

uses
  Spring,
  Spring.Collections,
  SysUtils;

type
  TNotifyPropertyChangedBase = class(TInterfaceBase, INotifyPropertyChanged)
  private
    fOnPropertyChanged: Event<TPropertyChangedEvent>;
    function GetOnPropertyChanged: IPropertyChangedEvent;
  protected
    procedure PropertyChanged(const propertyName: string);
  end;

  TMyObject = class(TNotifyPropertyChangedBase)
  private
    fName: string;
    procedure SetName(const Value: string);
  public
    property Name: string read fName write SetName;
  end;

  TMain = class
    procedure ListChanged(Sender: TObject; const item: TMyObject;
      action: TCollectionChangedAction);
  end;

{ TNotifyPropertyChangedBase }

function TNotifyPropertyChangedBase.GetOnPropertyChanged: IPropertyChangedEvent;
begin
  Result := fOnPropertyChanged;
end;

procedure TNotifyPropertyChangedBase.PropertyChanged(
  const propertyName: string);
begin
  fOnPropertyChanged.Invoke(Self,
    TPropertyChangedEventArgs.Create(propertyName) as IPropertyChangedEventArgs);
end;

{ TMyObject }

procedure TMyObject.SetName(const Value: string);
begin
  fName := Value;
  PropertyChanged('Name');
end;

{ TMain }

procedure TMain.ListChanged(Sender: TObject; const item: TMyObject;
  action: TCollectionChangedAction);
begin
  case action of
    caAdded: Writeln('item added ', item.Name);
    caRemoved, caExtracted: Writeln('item removed ', item.Name);
    caChanged: Writeln('item changed ', item.Name);
  end;
end;

var
  main: TMain;
  list: IList<TMyObject>;
  o: TMyObject;
begin
  list := TCollections.CreateObservableList<TMyObject>;
  list.OnChanged.Add(main.ListChanged);
  o := TMyObject.Create;
  o.Name := 'o1';
  list.Add(o);
  o := TMyObject.Create;
  o.Name := 'o2';
  list.Add(o);
  list[1].Name := 'o3';
  Readln;
end.

这篇关于更改对象时通知TObjectList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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